package com.wy.common.util.excel;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.*;

public class ExcelDemo {
    private static void exportDemo(HttpServletResponse response, File file, String fileName ,
                                   Map<String,  List<Object>> sheetData,Object obj) {
        // 整个 Excel 表格 book 对象
        SXSSFWorkbook book = new SXSSFWorkbook();

        for (Map.Entry<String, List<Object>> stringListEntry : sheetData.entrySet()) {
            List<Object> value = stringListEntry.getValue();
            // 获取行大小  rowLength
            int rowLength = stringListEntry.getValue().size();
            // 获取列大小 columnLength
            int columnLength = getNumberOfFields(obj);
            // 获取每一行对象中的数据
            for (int j = 0; j < rowLength; j++) {
                Object ojVal = value.get(j);
                // 对象数据
                List<Object> objects = printFields(ojVal);
                for (int i = 0; i < columnLength; i++){
                    // 每个行数据中的单元格数据
                    Object o = objects.get(i);
                    int v = 0;
                    if (o instanceof URL) {
                        // 如果要导出图片的话, 链接需要传递 URL 对象
//                        setCellPicture(book, row, patriarch, i, j, (URL) o);
                    } else {
//                        Cell cell = row.createCell(j);
//                        if (i == 0) {
//                            // 第一行为表头行，采用灰色底背景
//                            v = setCellValue(cell, o, headStyle);
//                        } else {
//                            // 其他行为数据行，默认白底色
//                            v = setCellValue(cell, o, rowStyle);
//                        }
                    }
//                    mergeArray[i][j] = v;
                }
                //            // 合并单元格
//            mergeCells(sheet, mergeArray);
//            // 设置下拉列表
//            setSelect(sheet, selectMap);
                }

        }
        // 写数据
        if (response != null) {
            // 前端导出
//            try {
//                write(response, book, fileName);
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
        } else {
            // 本地导出
            FileOutputStream fos;
            try {
                fos = new FileOutputStream(file);
                ByteArrayOutputStream ops = new ByteArrayOutputStream();
                book.write(ops);
                fos.write(ops.toByteArray());
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static int getNumberOfFields(Object obj) {
        int count = 0;
        Class<?> clazz = obj.getClass();
        // 获取类的所有字段，包括继承的字段
        Field[] fields = clazz.getDeclaredFields();
        // 过滤不需要的数据


        System.out.println("fields in the object is: "+fields);
        // 计算字段数量
        count = fields.length;
        return count;
    }
    public static List<Object> printFields(Object obj) {
        Class<?> clazz = obj.getClass(); // 获取对象的类
        // 获取类中声明的所有字段，包括私有字段（不包括父类的字段）
        Field[] fields = clazz.getDeclaredFields();
        List<Object> objects = new ArrayList<>();
        for (Field field : fields) {
            try {
                field.setAccessible(true); // 确保私有字段也可以访问
                Object value = field.get(obj); // 获取字段的值
                objects.add(value);
                System.out.println("Field name: " + field.getName() + ", Field value: " + value);
            } catch (IllegalAccessException e) {
                System.out.println("Cannot access field: " + field.getName());
            }
        }
        return objects;
    }
}
